package interpreter

import "wasm.go/binary"

type instrFn = func(vm *vm, args interface{})

var instrTable = make([]instrFn, 256)

func init() {
	instrTable[binary.Call] = call // hack!
	instrTable[binary.Drop] = drop
	instrTable[binary.Select] = _select
	instrTable[binary.I32Load] = i32Load
	instrTable[binary.I64Load] = i64Load
	instrTable[binary.F32Load] = f32Load
	instrTable[binary.F64Load] = f64Load
	instrTable[binary.I32Load8S] = i32Load8S
	instrTable[binary.I32Load8U] = i32Load8U
	instrTable[binary.I32Load16S] = i32Load16S
	instrTable[binary.I32Load16U] = i32Load16U
	instrTable[binary.I64Load8S] = i64Load8S
	instrTable[binary.I64Load8U] = i64Load8U
	instrTable[binary.I64Load16S] = i64Load16S
	instrTable[binary.I64Load16U] = i64Load16U
	instrTable[binary.I64Load32S] = i64Load32S
	instrTable[binary.I64Load32U] = i64Load32U
	instrTable[binary.I32Store] = i32Store
	instrTable[binary.I64Store] = i64Store
	instrTable[binary.F32Store] = f32Store
	instrTable[binary.F64Store] = f64Store
	instrTable[binary.I32Store8] = i32Store8
	instrTable[binary.I32Store16] = i32Store16
	instrTable[binary.I64Store8] = i64Store8
	instrTable[binary.I64Store16] = i64Store16
	instrTable[binary.I64Store32] = i64Store32
	instrTable[binary.MemorySize] = memorySize
	instrTable[binary.MemoryGrow] = memoryGrow
	instrTable[binary.I32Const] = i32Const
	instrTable[binary.I64Const] = i64Const
	instrTable[binary.F32Const] = f32Const
	instrTable[binary.F64Const] = f64Const
	instrTable[binary.I32Eqz] = i32Eqz
	instrTable[binary.I32Eq] = i32Eq
	instrTable[binary.I32Ne] = i32Ne
	instrTable[binary.I32LtS] = i32LtS
	instrTable[binary.I32LtU] = i32LtU
	instrTable[binary.I32GtS] = i32GtS
	instrTable[binary.I32GtU] = i32GtU
	instrTable[binary.I32LeS] = i32LeS
	instrTable[binary.I32LeU] = i32LeU
	instrTable[binary.I32GeS] = i32GeS
	instrTable[binary.I32GeU] = i32GeU
	instrTable[binary.I64Eqz] = i64Eqz
	instrTable[binary.I64Eq] = i64Eq
	instrTable[binary.I64Ne] = i64Ne
	instrTable[binary.I64LtS] = i64LtS
	instrTable[binary.I64LtU] = i64LtU
	instrTable[binary.I64GtS] = i64GtS
	instrTable[binary.I64GtU] = i64GtU
	instrTable[binary.I64LeS] = i64LeS
	instrTable[binary.I64LeU] = i64LeU
	instrTable[binary.I64GeS] = i64GeS
	instrTable[binary.I64GeU] = i64GeU
	instrTable[binary.F32Eq] = f32Eq
	instrTable[binary.F32Ne] = f32Ne
	instrTable[binary.F32Lt] = f32Lt
	instrTable[binary.F32Gt] = f32Gt
	instrTable[binary.F32Le] = f32Le
	instrTable[binary.F32Ge] = f32Ge
	instrTable[binary.F64Eq] = f64Eq
	instrTable[binary.F64Ne] = f64Ne
	instrTable[binary.F64Lt] = f64Lt
	instrTable[binary.F64Gt] = f64Gt
	instrTable[binary.F64Le] = f64Le
	instrTable[binary.F64Ge] = f64Ge
	instrTable[binary.I32Clz] = i32Clz
	instrTable[binary.I32Ctz] = i32Ctz
	instrTable[binary.I32PopCnt] = i32PopCnt
	instrTable[binary.I32Add] = i32Add
	instrTable[binary.I32Sub] = i32Sub
	instrTable[binary.I32Mul] = i32Mul
	instrTable[binary.I32DivS] = i32DivS
	instrTable[binary.I32DivU] = i32DivU
	instrTable[binary.I32RemS] = i32RemS
	instrTable[binary.I32RemU] = i32RemU
	instrTable[binary.I32And] = i32And
	instrTable[binary.I32Or] = i32Or
	instrTable[binary.I32Xor] = i32Xor
	instrTable[binary.I32Shl] = i32Shl
	instrTable[binary.I32ShrS] = i32ShrS
	instrTable[binary.I32ShrU] = i32ShrU
	instrTable[binary.I32Rotl] = i32Rotl
	instrTable[binary.I32Rotr] = i32Rotr
	instrTable[binary.I64Clz] = i64Clz
	instrTable[binary.I64Ctz] = i64Ctz
	instrTable[binary.I64PopCnt] = i64PopCnt
	instrTable[binary.I64Add] = i64Add
	instrTable[binary.I64Sub] = i64Sub
	instrTable[binary.I64Mul] = i64Mul
	instrTable[binary.I64DivS] = i64DivS
	instrTable[binary.I64DivU] = i64DivU
	instrTable[binary.I64RemS] = i64RemS
	instrTable[binary.I64RemU] = i64RemU
	instrTable[binary.I64And] = i64And
	instrTable[binary.I64Or] = i64Or
	instrTable[binary.I64Xor] = i64Xor
	instrTable[binary.I64Shl] = i64Shl
	instrTable[binary.I64ShrS] = i64ShrS
	instrTable[binary.I64ShrU] = i64ShrU
	instrTable[binary.I64Rotl] = i64Rotl
	instrTable[binary.I64Rotr] = i64Rotr
	instrTable[binary.F32Abs] = f32Abs
	instrTable[binary.F32Neg] = f32Neg
	instrTable[binary.F32Ceil] = f32Ceil
	instrTable[binary.F32Floor] = f32Floor
	instrTable[binary.F32Trunc] = f32Trunc
	instrTable[binary.F32Nearest] = f32Nearest
	instrTable[binary.F32Sqrt] = f32Sqrt
	instrTable[binary.F32Add] = f32Add
	instrTable[binary.F32Sub] = f32Sub
	instrTable[binary.F32Mul] = f32Mul
	instrTable[binary.F32Div] = f32Div
	instrTable[binary.F32Min] = f32Min
	instrTable[binary.F32Max] = f32Max
	instrTable[binary.F32CopySign] = f32CopySign
	instrTable[binary.F64Abs] = f64Abs
	instrTable[binary.F64Neg] = f64Neg
	instrTable[binary.F64Ceil] = f64Ceil
	instrTable[binary.F64Floor] = f64Floor
	instrTable[binary.F64Trunc] = f64Trunc
	instrTable[binary.F64Nearest] = f64Nearest
	instrTable[binary.F64Sqrt] = f64Sqrt
	instrTable[binary.F64Add] = f64Add
	instrTable[binary.F64Sub] = f64Sub
	instrTable[binary.F64Mul] = f64Mul
	instrTable[binary.F64Div] = f64Div
	instrTable[binary.F64Min] = f64Min
	instrTable[binary.F64Max] = f64Max
	instrTable[binary.F64CopySign] = f64CopySign
	instrTable[binary.I32WrapI64] = i32WrapI64
	instrTable[binary.I32TruncF32S] = i32TruncF32S
	instrTable[binary.I32TruncF32U] = i32TruncF32U
	instrTable[binary.I32TruncF64S] = i32TruncF64S
	instrTable[binary.I32TruncF64U] = i32TruncF64U
	instrTable[binary.I64ExtendI32S] = i64ExtendI32S
	instrTable[binary.I64ExtendI32U] = i64ExtendI32U
	instrTable[binary.I64TruncF32S] = i64TruncF32S
	instrTable[binary.I64TruncF32U] = i64TruncF32U
	instrTable[binary.I64TruncF64S] = i64TruncF64S
	instrTable[binary.I64TruncF64U] = i64TruncF64U
	instrTable[binary.F32ConvertI32S] = f32ConvertI32S
	instrTable[binary.F32ConvertI32U] = f32ConvertI32U
	instrTable[binary.F32ConvertI64S] = f32ConvertI64S
	instrTable[binary.F32ConvertI64U] = f32ConvertI64U
	instrTable[binary.F32DemoteF64] = f32DemoteF64
	instrTable[binary.F64ConvertI32S] = f64ConvertI32S
	instrTable[binary.F64ConvertI32U] = f64ConvertI32U
	instrTable[binary.F64ConvertI64S] = f64ConvertI64S
	instrTable[binary.F64ConvertI64U] = f64ConvertI64U
	instrTable[binary.F64PromoteF32] = f64PromoteF32
	instrTable[binary.I32ReinterpretF32] = i32ReinterpretF32
	instrTable[binary.I64ReinterpretF64] = i64ReinterpretF64
	instrTable[binary.F32ReinterpretI32] = f32ReinterpretI32
	instrTable[binary.F64ReinterpretI64] = f64ReinterpretI64
	instrTable[binary.I32Extend8S] = i32Extend8S
	instrTable[binary.I32Extend16S] = i32Extend16S
	instrTable[binary.I64Extend8S] = i64Extend8S
	instrTable[binary.I64Extend16S] = i64Extend16S
	instrTable[binary.I64Extend32S] = i64Extend32S
	instrTable[binary.TruncSat] = truncSat
}
